package com.wu.javax.servlet.http;

import com.wu.util.TomcatUtil;

/**
 * 创建一个 cookie，由 servlet 发送到 Web 浏览器的少量信息，由浏览器保存，然后发送回服务器。
 * cookie 的值可以唯一标识一个客户端，因此 cookie 常用于会话管理。
 * cookie 具有名称、单个值和可选属性，例如注释、路径和域限定符、最大年龄和版本号。
 * 某些 Web 浏览器在处理可选属性的方式上存在错误，因此请谨慎使用它们以提高 servlet 的互操作性
 */
public class Cookie {
    private final String name;
    private String value;
    private String comment;
    private String domain;
    private int maxAge = TomcatUtil.getCookieOverdueTime();
    private String path = "/";
    private boolean secure;
    private int version = 0;
    private boolean isHttpOnly = false;


    /**
     * 构造具有指定名称和值的 cookie。
     * 一旦创建了 cookie，就不能更改 cookie 的名称。
     * 该值可以是服务器选择发送的任何内容。 它的值可能只有服务器感兴趣。 创建后可以使用setValue方法更改 cookie 的值。
     *
     * @param name  cookie 的名称
     * @param value cookie 的值
     */
    public Cookie(String name, String value) {
        this.name = name;
        this.value = value;
    }

    /**
     * 返回 cookie 的名称。 创建后无法更改名称
     *
     * @return cookie 的名称
     */
    public String getName() {
        return name;
    }

    /**
     * 设置此 Cookie 遵守的 cookie 协议的版本。
     *
     * @param value 0 如果 cookie 应符合原始 Netscape 规范； 1 如果 cookie 应符合 RFC 2109
     */
    public void setValue(String value) {
        this.value = value;
    }

    /**
     * 获取此 Cookie 的当前值。
     *
     * @return 此 Cookie 的当前值
     * @see #setValue
     */
    public String getValue() {
        return value;
    }

    /**
     * 返回描述此 cookie 用途的注释，如果 cookie 没有注释，则返回null 。
     *
     * @return cookie 的注释，如果未指定则为null
     */
    public String getComment() {
        return comment;
    }

    /**
     * 指定描述 cookie 用途的注释。
     *
     * @param comment 注释
     */
    public void setComment(String comment) {
        this.comment = comment;
    }

    /**
     * 获取此 Cookie 的域名。
     *
     * @return 此 Cookie 的域名
     */
    public String getDomain() {
        return domain;
    }

    /**
     * 指定应在其中显示此 cookie 的域。
     * 默认情况下，cookies 只返回给发送它们的服务器。
     *
     * @param domain 此 cookie 在其中可见的域名
     */
    public void setDomain(String domain) {
        this.domain = domain;
    }

    /**
     * 获取此 Cookie 的最大年龄（以秒为单位）。
     * 默认情况下，返回-1 ，这表示 cookie 将持续到浏览器关闭。
     *
     * @return 一个整数，以秒为单位指定 cookie 的最大年龄； 如果为负，则表示 cookie 会一直存在，直到浏览器关闭
     */
    public int getMaxAge() {
        return maxAge;
    }

    /**
     * 设置此 Cookie 的最长期限（以秒为单位）。
     * 正值表示 cookie 将在经过多少秒后过期。 请注意，该值是 cookie 将过期的最大年龄，而不是 cookie 的当前年龄。
     * 负值表示 cookie 不会持久存储，将在 Web 浏览器退出时删除。 零值会导致 cookie 被删除。
     *
     * @param maxAge 一个整数，以秒为单位指定 cookie 的最大年龄； 如果为负，则表示不存储 cookie； 如果为零，则删除 cookie
     */
    public void setMaxAge(int maxAge) {
        this.maxAge = maxAge;
    }

    /**
     * 返回浏览器将此 cookie 返回到的服务器上的路径。 该 cookie 对服务器上的所有子路径可见。
     *
     * @return 指定包含 servlet 名称的路径的String ，例如/catalog
     */
    public String getPath() {
        return path;
    }

    /**
     * 指定客户端应将 cookie 返回到的 cookie 的路径。
     * cookie 对您指定目录中的所有页面以及该目录子目录中的所有页面可见。 cookie 的路径必须包括设置 cookie 的 servlet，例如， /catalog ，这使得 cookie 对服务器上/catalog下的所有目录可见。
     *
     * @param uri 指定路径的String
     */
    public void setPath(String uri) {
        this.path = uri;
    }

    /**
     * 如果浏览器仅通过安全协议发送 cookie，则返回true如果浏览器可以使用任何协议发送 cookie，则返回false 。
     *
     * @return 如果浏览器使用安全协议，则为true ，否则为false
     */
    public boolean getSecure() {
        return secure;
    }

    /**
     * 向浏览器指示是否应仅使用安全协议（例如 HTTPS 或 SSL）发送 cookie。
     * 默认值为false 。
     *
     * @param flag flag – 如果为true ，则仅在使用安全协议时才将 cookie 从浏览器发送到服务器； 如果为false ，则通过任何协议发送
     */
    public void setSecure(boolean flag) {
        this.secure = flag;
    }

    public int getVersion() {
        return version;
    }

    public void setVersion(int version) {
        this.version = version;
    }

    /**
     * 检查此 Cookie 是否已标记为HttpOnly 。
     *
     * @return 如果此 Cookie 已被标记为HttpOnly ，则为 true ，否则为 false
     */

    public boolean isHttpOnly() {
        return isHttpOnly;
    }

    /**
     * 将此 Cookie 标记或取消标记为HttpOnly 。
     * 如果isHttpOnly设置为true ，则通过向其添加HttpOnly属性，将此 cookie 标记为HttpOnly 。
     * HttpOnly cookie 不应该暴露给客户端脚本代码，因此可能有助于减轻某些类型的跨站点脚本攻击。
     *
     * @param httpOnly 如果将此 cookie 标记为HttpOnly则为 true ，否则为 false
     */
    public void setHttpOnly(boolean httpOnly) {
        isHttpOnly = httpOnly;
    }

    @Override
    public String toString() {
        return name + "=" + value + "; path=" + path + "; \r";
    }
}
